Аннотация
Объяснение, что такое контейнер и как его использовать для управления приложениями и их развертывания с библиотеками вспомогательного программного обеспечения и зависимостями
Установка утилит управления контейнерами и запуск простого контейнера без прав root
Поиск, извлечение и просмотр образов контейнеров, а также управление образами контейнеров, полученными из удаленного реестра контейнеров и сохраненными на сервере
Запуск контейнеров с расширенными опциями, отображение списка контейнеров, запущенных в системе, а также запуск, остановка и уничтожение контейнеров
Предоставление постоянного хранилища для данных контейнера путем монтирования каталога с хоста контейнеров внутри работающего контейнера
Запуск, остановка и проверка состояния контейнера как службы systemd
Знакомство с контейнерами (и тест)
Запуск базового контейнера (и упражнение)
Поиск образов контейнеров и управление ими (и упражнение)
Расширенное управление контейнерами (и упражнение)
Присоединение постоянного хранилища к контейнеру (и упражнение)
Управление контейнерами как службами (и упражнение)
Запуск контейнеров
После завершения этого раздела вы сможете объяснить, что такое контейнер и как его использовать для управления приложениями и их развертывания с библиотеками вспомогательного программного обеспечения и зависимостями.
Программные приложения обычно зависят от других библиотек, файлов конфигурации и служб, которые предоставляются средой выполнения. Традиционно среда выполнения для программного приложения устанавливается в операционной системе, работающей на физическом хосте или виртуальной машине. Все зависимости приложений устанавливаются вместе с операционной системой на хосте.
В Red Hat Enterprise Linux для управления зависимостями приложений используются системы упаковки, такие как RPM. Когда вы устанавливаете пакет httpd, система RPM также устанавливает правильные библиотеки и другие зависимости для этого пакета.
httpd
Основной недостаток приложения, развертываемого традиционным способом, — тесная связь его зависимостей со средой выполнения. Приложению могут потребоваться версии вспомогательного программного обеспечения, более ранние или более поздние, чем версии программного обеспечения, предоставляемого с операционной системой. Аналогичным образом двум приложениям в одной системе могут потребоваться разные версии одного программного обеспечения, несовместимые друг с другом.
Один из способов разрешить эти конфликты — упаковать и развернуть приложение как контейнер. Контейнер — это набор из одного или нескольких процессов, изолированных от остальной части системы.
Представьте обычный грузовой контейнер. Это стандартный способ упаковки и отправки товаров. Он помечается, загружается, разгружается и транспортируется из одного расположения в другое как единое целое. Содержимое контейнера изолируется от содержимого других контейнеров, чтобы они никак не влияли друг на друга.
Программные контейнеры ― это способ упаковки приложений для упрощения развертывания и управления.
Контейнеры обеспечивают многие из преимуществ, которые дают виртуальные машины, например безопасность, хранилище и сетевую изоляцию.
Обе технологии изолируют свои библиотеки приложений и ресурсы среды выполнения от операционной системы или гипервизора хоста и наоборот.
Контейнеры и виртуальные машины отличаются тем, как они взаимодействуют с оборудованием и базовой операционной системой.
Виртуализация:
Позволяет одновременно нескольким операционным системам работать на одной аппаратной платформе.
Использует гипервизор для разделения оборудования на несколько виртуальных аппаратных систем, позволяя нескольким операционным системам работать параллельно.
Требует полноценное окружение операционной системы для поддержки приложения.
Сравните это с контейнерами:
Работают непосредственно в операционной системе. Ресурсы оборудования и ОС совместно используются всеми контейнерами в системе. Благодаря этому приложения могут оставаться небольшими и беспроблемно работать параллельно.
Совместно используют одно ядро операционной системы, изолируют процессы контейнеризованных приложений от остальной части системы и используют любое программное обеспечение, совместимое с этим ядром.
Требуют гораздо меньше аппаратных ресурсов, чем виртуальные машины, благодаря чему их можно быстро запускать и останавливать и им требуется меньший объем хранилища.
Некоторые приложения могут оказаться непригодными для запуска в виде контейнера. Например, приложениям, обращающимся к низкоуровневым сведениям об оборудовании, может потребоваться более прямой доступ к оборудованию, чем обычно предоставляют контейнеры.
Red Hat Enterprise Linux реализует контейнеры с помощью таких базовых технологий, как:
контрольные группы (cgroup) для управления ресурсами;
пространства имен для изоляции процессов;
SELinux и Seccomp (безопасный вычислительный режим) для обеспечения соблюдения границ безопасности.
Подробное описание архитектуры и безопасности контейнеров см. в информационном документе «Десять уровней безопасности контейнеров».
Контейнеры — это эффективный способ обеспечения возможности повторного использования и переносимости размещенных приложений. Их можно легко перемещать из одного окружения в другое, например из окружения разработки в производственное. Вы можете сохранить несколько версий контейнера и быстро обращаться к нужным.
Контейнеры обычно являются временными. Вы можете сохранять данные, созданные запущенным контейнером, в постоянном хранилище, но сами контейнеры обычно запускаются при необходимости, а затем останавливаются и удаляются. Новый процесс контейнера будет запущен, когда потребуется этот конкретный контейнер.
Контейнеры запускаются из образов контейнеров. Образы контейнеров ― это своеобразные макеты для создания контейнеров.
Образы контейнеров упаковывают приложение вместе со всеми его зависимостями, такими как:
системные библиотеки;
среды выполнения языков программирования;
библиотеки языков программирования;
параметры конфигурации;
статические файлы данных.
Образы контейнеров — это неизменяемые файлы, содержащие код и зависимости, необходимые для запуска контейнера.
Образы контейнеров создаются согласно спецификациям, таким как спецификация формата образа OCI (Open Container Initiative). Эти спецификации определяют формат образов контейнеров, а также метаданные об операционных системах хостов контейнеров и аппаратных архитектурах, которые поддерживает образ.
Вы можете установить сложное приложение, состоящее из нескольких служб, в одном контейнере. Например, у вас может быть веб-сервер, использующий базу данных и систему передачи сообщений. Однако контейнером, предназначенным для нескольких служб, сложно управлять.
Более эффективным подходом будет запускать каждый компонент (веб-сервер, базу данных и систему передачи сообщений) в отдельных контейнерах. Таким образом, обновления и обслуживание отдельных компонентов приложения не повлияют на другие компоненты и на стек приложений.
Хорошей отправной точкой для изучения контейнеров будет создание отдельных контейнеров на одном сервере, выступающем в качестве хоста контейнеров. Red Hat Enterprise Linux предоставляет для этой цели набор контейнерных утилит, включая следующие:
podman: напрямую управляет контейнерами и образами контейнеров;
podman
skopeo: позволяет просматривать, копировать, удалять и подписывать образы;
skopeo
buildah: позволяет создавать новые образы контейнеров.
buildah
Эти утилиты совместимы со спецификацией OCI (Open Container Initiative). Они могут использоваться для управления любыми контейнерами Linux, созданными OCI-совместимыми модулями запуска контейнеров, такими как Docker. Эти утилиты специально разработаны для запуска контейнеров в ОС Red Hat Enterprise Linux на хосте контейнеров, состоящем из одного узла.
В этой главе вы будете использовать команды podman и skopeo для запуска контейнеров и существующих образов контейнеров и управления ими.
Использование утилиты buildah для создания собственных образов контейнеров выходит за рамки этого курса, но рассматривается в курсе Red Hat Training Red Hat OpenShift I: Containers & Kubernetes (DO180).
На хосте контейнеров можно запускать контейнеры от имени пользователя root или обычного непривилегированного пользователя. Контейнеры, запускаемые непривилегированными пользователями, называются контейнерами без прав root.
Контейнеры без прав root более безопасны, но имеют ряд ограничений. Например, такие контейнеры не могут публиковать сетевые службы через привилегированные порты хоста контейнеров (это порты с номерами ниже 1024).
При необходимости можно запускать контейнеры напрямую от имени пользователя root, но это может снизить уровень безопасности системы, в результате чего злоумышленник может взломать контейнер.
root
Новые приложения все чаще реализуют функциональные компоненты с помощью контейнеров. Эти контейнеры предоставляют службы, которые используют другие компоненты приложения. В организации управление растущим количеством контейнеров может быстро стать весьма сложной задачей.
Для развертывания контейнеров в больших производственных масштабах требуется окружение, способное адаптироваться под некоторые из указанных ниже задач.
Платформа должна обеспечивать доступность контейнеров, которые предоставляют клиентам важные службы.
Окружение должно реагировать на изменение интенсивности использования приложений путем увеличения или уменьшения количества запущенных контейнеров и балансировки нагрузки по трафику.
Платформа должна выявлять сбои контейнера или хоста и реагировать соответствующим образом.
Разработчикам может потребоваться автоматизированный рабочий процесс для прозрачной и безопасной доставки новых версий приложений клиентам.
Kubernetes ― это служба оркестровки, которая упрощает развертывание, администрирование и масштабирование приложений на основе контейнеров в кластере хостов контейнеров. Она помогает управлять обновлениями DNS при запуске новых контейнеров. Она помогает перенаправлять трафик в контейнеры с помощью балансировщика нагрузки, который также позволяет вручную или автоматически увеличивать и уменьшать количество контейнеров. Кроме того, эта служба поддерживает пользовательские проверки работоспособности для мониторинга контейнеров и их перезапуска в случае сбоя.
Red Hat предоставляет дистрибутив Kubernetes с именем Red Hat OpenShift. OpenShift — это набор модульных компонентов и служб, построенных на основе инфраструктуры Kubernetes. Он добавляет дополнительные функции, такие как удаленное веб-управление, многоклиентность, мониторинг и аудит, управление жизненным циклом приложений и экземпляры самообслуживания для разработчиков.
Решение Red Hat OpenShift не рассматривается в этом курсе, но вы можете узнать о нем больше по адресу https://www.openshift.com.
В компаниях отдельные контейнеры обычно не запускаются из командной строки. Рекомендуется запускать производственные контейнеры с помощью платформы на основе Kubernetes, например Red Hat OpenShift.
Однако может потребоваться использовать команды для работы с контейнерами и образами вручную или в меньших масштабах. Для этого можно установить набор контейнерных утилит в системе Red Hat Enterprise Linux 8.
Эта глава посвящена такому сценарию использования, чтобы вы могли лучше понять, что такое контейнеры, как они работают и чем могут быть полезны.
Man-страницы cgroups(7), namespaces(7) и seccomp(2)
cgroups
namespaces
seccomp
Спецификация образов Open Container Initiative (OCI)
Дополнительные сведения см. в главе Starting with containers руководства Red Hat Enterprise Linux 8 Building, Running, and Managing Containers: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index#starting-with-containers_building-running-and-managing-containers